home *** CD-ROM | disk | FTP | other *** search
/ Stone Design / Stone Design.iso / Stone_Friends / Wave / WavesWorld / Source / IBPalettes / WW3DKit / WWSceneClock.m < prev    next >
Encoding:
Text File  |  1995-05-16  |  8.0 KB  |  340 lines

  1. // copyright 1993 Michael B. Johnson; some portions copyright 1994, MIT
  2. // see COPYRIGHT for reuse legalities
  3. //
  4.  
  5.  
  6. #import "WWSceneClock.h"
  7. #import "WW3DWell.h"  // for delegate routine
  8. #import "WWEveParser.h"  // for setTicksPerSecond
  9.  
  10. @implementation WWSceneClock
  11.  
  12. + initialize { return [WWSceneClock setVersion:2], self; }
  13.  
  14. - init
  15. {
  16.   [super init];
  17.  
  18.   currentTime = 0.0;
  19.   samplesPerSecond = 60.0;
  20.   increment = 1./samplesPerSecond;
  21.   skip = 10. * increment;
  22.   timedEntry = (DPSTimedEntry)0;
  23.   ratio = 1.;
  24.   isPaused = YES;
  25.   mark = 3.0;
  26.  
  27.   return self;
  28. }
  29.  
  30. - awake
  31. {
  32.   [super awake];
  33.   timedEntry = (DPSTimedEntry)0;
  34.   isPaused = YES;
  35.   return self;
  36. }
  37.  
  38. - (BOOL)isPaused { return isPaused; }
  39.  
  40. - removeTimedEntry
  41. {
  42.   if (timedEntry)
  43.   {  DPSRemoveTimedEntry(timedEntry);
  44.      timedEntry = (DPSTimedEntry)0;
  45.      isPaused = YES;
  46.   }
  47.   isPaused = YES;
  48.   return self;
  49. }
  50.  
  51. - free
  52. {
  53.    [self removeTimedEntry];
  54.    return [super free];
  55. }
  56.  
  57. - reset:sender
  58. {
  59.    [self removeTimedEntry];
  60.    [self setCurrentTime:0.0];
  61.    [delegate revertSceneClockInspector];
  62.    return self;
  63. }
  64.  
  65. - (float)mark { return mark; }
  66.  
  67. - setMark:(float)newMark 
  68. {  mark = newMark; 
  69.    [delegate revertSceneClockInspector];
  70.    return self; 
  71. }
  72.  
  73. - takeMark:sender
  74. {
  75.    [self setMark:[sender floatValue]];
  76.    return self;
  77. }
  78.  
  79. /////////////////////////////////////////////////////////////////////////
  80. ///////////////////////// increment /////////////////////////////////////
  81. /////////////////////////////////////////////////////////////////////////
  82. - (float)increment {  return increment; }
  83.  
  84. - increment:sender
  85. {
  86.    [self removeTimedEntry];
  87.    [self setCurrentTime:([self currentTime] + [self increment])];
  88.    [delegate revertSceneClockInspector];
  89.    return self;
  90. }
  91.  
  92. - setIncrement:(float)newIncrement
  93. {
  94.    if (newIncrement <= 0.0)
  95.    {  NXLogError("sceneClockIncrement must be greater than 0.\n");
  96.       return nil;
  97.    }
  98.    increment = newIncrement;
  99.    // need to tell the model's interp about the value of samplesPerSecond
  100.    // set the increment appropriately...
  101.    samplesPerSecond = 1.0/increment;
  102.    [scene setTicksPerSecond:[self samplesPerSecond]];
  103.    [delegate revertSceneClockInspector];
  104.    return self;
  105. }
  106.  
  107. /////////////////////////////////////////////////////////////////////////
  108. ///////////////////////// skip /////////////////////////////////////
  109. /////////////////////////////////////////////////////////////////////////
  110. - (float)skip {  return skip; }
  111.  
  112. - skip:sender
  113. {
  114.    [self removeTimedEntry];
  115.    [self setCurrentTime:([self currentTime] + [self skip])];
  116.    return self;
  117. }
  118.  
  119. - setSkip:(float)newSkip
  120. {
  121.    if (newSkip <= 0.0)
  122.    {  NXLogError("sceneClockSkip must be greater than 0.\n");
  123.       return nil;
  124.    }
  125.    skip = newSkip;
  126.    // need to tell the model's interp about the value of samplesPerSecond
  127.    // set the skip appropriately...
  128.    [delegate revertSceneClockInspector];
  129.    return self;
  130. }
  131.  
  132. /////////////////////////////////////////////////////////////////////////
  133. ///////////////////////// current time //////////////////////////////////
  134. /////////////////////////////////////////////////////////////////////////
  135. - (float)timestamp { return currentTime; }
  136. - (float)currentTime { return currentTime; }
  137. - setCurrentTime:(float)newTime
  138. {
  139.    currentTime = newTime;
  140.    if (currentTime < 0.0)
  141.    {  currentTime = 0.0;
  142.    }
  143.    [scene setCurrentTime:currentTime];
  144.    [delegate revertSceneClockInspector];
  145.    return self;
  146. }
  147.  
  148.  
  149. - setCurrentTimeQuietly:(float)newTime
  150. {
  151.    currentTime = newTime;
  152.    if (currentTime < 0.0)
  153.    {  currentTime = 0.0;
  154.    }
  155.    [scene setCurrentTime:currentTime];
  156.    return self;
  157. }
  158.  
  159.  
  160. - decrement:sender
  161. {
  162.    [self removeTimedEntry];
  163.    [self setCurrentTime:([self currentTime] - [self increment])];
  164.    [delegate revertSceneClockInspector];
  165.    return self;
  166. }
  167.  
  168. static void fastForwardFunc(DPSTimedEntry tag, double now, char *userdata)
  169. {
  170.    WWSceneClock  *self = (id)userdata;
  171.  
  172.    [self setCurrentTime:([self currentTime] + [self skip])];
  173.    if ([self currentTime] >= [self mark])
  174.    {  // I'm at the stop mark; so stop
  175.       [[self delegate] pause:nil];
  176.    }
  177.    // should probably send a msg to a delegate to tell it that the scene info has changed...
  178.    [[self delegate] revertSceneClockInspector];
  179.  
  180.    return ;
  181. }
  182.  
  183. - fastForward:sender
  184. {
  185.    [self removeTimedEntry];
  186.    timedEntry = DPSAddTimedEntry((double)(increment * ratio),
  187.                  (DPSTimedEntryProc)fastForwardFunc,
  188.                  self,
  189.                  NX_MODALRESPTHRESHOLD);
  190.    isPaused = NO;
  191.    return self;
  192. }
  193.  
  194. static void rewindFunc(DPSTimedEntry tag, double now, char *userdata)
  195. {
  196.    WWSceneClock  *self = (id)userdata;
  197.  
  198.  
  199.    [self setCurrentTime:([self currentTime] - [self skip])];
  200.    if ([self currentTime] <= 0.0)  // time is always >= 0.0
  201.    {  // I'm totally rewound, stop 
  202.       [[self delegate] pause:nil];
  203.    }
  204.    // should probably send a msg to a delegate to tell it that the scene info has changed...
  205.    [[self delegate] revertSceneClockInspector];
  206.  
  207.    return ;
  208. }
  209.  
  210. - rewind:sender
  211. {
  212.    [self removeTimedEntry];
  213.    timedEntry = DPSAddTimedEntry((double)(increment * ratio),
  214.                  (DPSTimedEntryProc)rewindFunc,
  215.                  self,
  216.                  NX_MODALRESPTHRESHOLD);
  217.    isPaused = NO;
  218.    return self;
  219. }
  220.  
  221. - pause:sender
  222. {
  223.    [self removeTimedEntry];
  224.    [delegate revertSceneClockInspector];
  225.    return self;
  226. }
  227.  
  228. static void playFunc(DPSTimedEntry tag, double now, char *userdata)
  229. {
  230.    WWSceneClock  *self = (id)userdata;
  231.  
  232.    [self setCurrentTime:([self currentTime] + [self increment])];
  233.    if ([self currentTime] >= [self mark])
  234.    {  // I'm at the stop mark; so stop
  235.       [[self delegate] pause:nil];
  236.    }
  237.    // should probably send a msg to a delegate to tell it that the scene info has changed...
  238.    [self->delegate revertSceneClockInspector];
  239.  
  240.    return ;
  241. }
  242.  
  243. - play:sender
  244. {
  245.    [self removeTimedEntry];
  246.    timedEntry = DPSAddTimedEntry((double)(increment * ratio),
  247.                  (DPSTimedEntryProc)playFunc,
  248.                  self,
  249.                  NX_MODALRESPTHRESHOLD);
  250.    isPaused = NO;
  251.    return self;
  252. }
  253.  
  254. /////////////////////////////////////////////////////////////////////////
  255. ///////////////////////// samples/sec //////////////////////////////////
  256. /////////////////////////////////////////////////////////////////////////
  257. - (float)samplesPerSecond { return samplesPerSecond; }
  258.  
  259. - setSamplesPerSecond:(float)newRate 
  260.    if (newRate <= 0.0)
  261.    {  NXLogError("scene sample rate must be greater than 0, not %d\n", newRate);
  262.       return nil;
  263.    }
  264.    [self removeTimedEntry];
  265.    samplesPerSecond = newRate; 
  266.    increment = 1.0/samplesPerSecond;
  267.    skip = 10. * [self increment];
  268.    [scene setTicksPerSecond:samplesPerSecond];
  269.    [delegate revertSceneClockInspector];
  270.    return self; 
  271. }
  272.  
  273. - (float)ratio { return ratio; }
  274.  
  275. - setRatio:(float)newRatio 
  276.    if (newRatio < 0.0)
  277.    {  NXLogError("the ratio of real time to scene time must be positive, not %d\n", newRatio);
  278.       return nil;
  279.    }
  280.    [self removeTimedEntry];
  281.    ratio = newRatio; 
  282.    [delegate revertSceneClockInspector];
  283.    return self; 
  284. }
  285.  
  286. - delegate { return delegate; }
  287. - setDelegate:newDelegate { delegate = newDelegate; return self; }
  288. - setScene:newScene { scene = newScene; return self; }
  289.  
  290. // NeXTSTEP archiving:
  291.  
  292. #define typeVectorVersion1 "fffff"
  293. #define typeValuesVersion1 ¤tTime, &increment, &skip, &samplesPerSecond, &ratio
  294.  
  295. #define typeVector "ffffff"
  296. #define typeValues ¤tTime, &increment, &skip, &samplesPerSecond, &ratio, &mark
  297.  
  298. - read:(NXTypedStream*)stream 
  299. {
  300.   int version;
  301.    self->currentTime += self->skip;
  302.    if (self->currentTime > self->mark)
  303.  
  304.  
  305.  
  306.   [super read:stream];
  307.  
  308.   version = NXTypedStreamClassVersion(stream,"WWSceneClock");
  309.   if (version == 0) NXReadTypes(stream,"i",&version), version=1;
  310.   if (version == 1)
  311.   {  NXReadTypes(stream, typeVectorVersion1, typeValuesVersion1);
  312.      scene = NXReadObject(stream);
  313.      delegate = NXReadObject(stream);
  314.      mark = 3.0;
  315.   }
  316.   if (version == 2)
  317.   {  NXReadTypes(stream, typeVector, typeValues);
  318.      scene = NXReadObject(stream);
  319.      delegate = NXReadObject(stream);
  320.   }
  321.  
  322.   return self; 
  323. }
  324.  
  325. - write:(NXTypedStream*)stream 
  326. {
  327.   [super write:stream];
  328.  
  329.   NXWriteTypes(stream,typeVector, typeValues);
  330.   NXWriteObjectReference(stream, scene);
  331.   NXWriteObjectReference(stream, delegate);
  332.  
  333.   return self;
  334. }
  335.  
  336.  
  337. @end
  338.